import axios, { 
    type AxiosInstance,
    type AxiosRequestConfig,
    type AxiosResponse,
    type AxiosError ,
    type InternalAxiosRequestConfig
} from 'axios';
import { ElMessage } from 'element-plus';
import { useUserStore } from '../stores/userStore';

// 定义统一响应结构
interface ApiResponse<T = any> {
  code: number | string
  message: string
  data: T
}

class Request {

  private instance: AxiosInstance;

  constructor() {
    this.instance = axios.create({
      //baseURL: import.meta.env.VITE_API_BASE_URL,// 替换为你的后端 API 地址
      baseURL: 'http://localhost:8081',
      timeout: 5000,// 请求超时时间
      headers: {
        'Content-Type': 'application/json;charset=UTF-8'
      }
    })

    this.initInterceptors()
  }

  // 初始化拦截器
  private initInterceptors(){
    // 请求拦截器
    this.instance.interceptors.request.use(
      (config: InternalAxiosRequestConfig) => {
        // 在请求发送前可以做一些事情，比如添加 token
        const userStore = useUserStore()
        if (userStore.token) {
          config.headers.Authorization = `Bearer ${userStore.token}`
        }
        return config
      },
      (error: AxiosError) => {
        return Promise.reject(error)
      }
    )

    // 响应拦截器
    this.instance.interceptors.response.use(
      (response: AxiosResponse<ApiResponse>) => {
        // 对响应数据做些处理，比如统一处理错误码
        const res = response.data
        if (res.code !== 200) {
          ElMessage.error(res.message || 'Error');
          return Promise.reject(res);
        }
        return res.data;
      },
      (error: AxiosError) => {
        // 统一处理错误
        // 处理 HTTP 网络错误
        let message = ''
        const status = error.response?.status
        const userStore = useUserStore() // 缓存 userStore 调用结果
        switch (status) {
            case 401:
              message = 'Token 失效，请重新登录'
              userStore.logout()
              // 可以考虑在用户确认后刷新页面，或者执行其他操作
              // window.location.reload()
              break
            case 403:
              message = '拒绝访问'
              break
            case 404:
              message = '请求地址错误'
              break
            case 500:
              message = '服务器故障'
              break
            default:
              message = '网络连接故障'
          }
          ElMessage.error(message)
          return Promise.reject(error)  
        }  
      
    )
  }

  // 封装 GET 请求
  public get<T = any>(
    url: string,
    params?: object,
    config?: AxiosRequestConfig
  ): Promise<T> {
    return this.instance.get(url, {
      params,
      ...config
    })
  }

  // 封装 POST 请求
  public post<T = any>(
    url: string,
    data?: object,
    config?: AxiosRequestConfig
  ): Promise<T> {
    return this.instance.post(url, data, config)
  }

  public put<T = any>(
    url: string,
    data?: object,
    config?: AxiosRequestConfig
  ): Promise<T> {
    return this.instance.put(url, data, config)
  }
  
  public delete<T = any>(
    url: string,
    params?: object,
    config?: AxiosRequestConfig
  ): Promise<T> {
    return this.instance.delete(url, { params, ...config })
  }

}

const request = new Request()
export default request



// 创建 axios 实例
// const instance: AxiosInstance = axios.create({
//   baseURL: 'http://localhost:8081', // 替换为你的后端 API 地址
//   timeout: 5000, // 请求超时时间
//   headers: {
//     'Content-Type': 'application/json',
//   },
// });

// 请求拦截器
// instance.interceptors.request.use(
//   (config: InternalAxiosRequestConfig) => {
//     // 在请求发送前可以做一些事情，比如添加 token
//     const userStore = useUserStore()
//     if (userStore.token) {
//         config.headers.Authorization = `Bearer ${userStore.token}`
//     }
//     return config
//   },
//   (error: AxiosError) => {
//     return Promise.reject(error);
//   }
// );

// 响应拦截器
// instance.interceptors.response.use(
//   (response: AxiosResponse) => {
//     // 对响应数据做些处理，比如统一处理错误码
//     const res = response.data
//     if (res.code !== 200) {
//       ElMessage.error(res.message || 'Error');
//       return Promise.reject(res);
//     }
//     return res.data;
//   },
//   (error: AxiosError) => {
//     // 统一处理错误
//     // 处理 HTTP 网络错误
//     let message = ''
//     const status = error.response?.status
//     const userStore = useUserStore() // 缓存 userStore 调用结果
//     switch (status) {
//         case 401:
//           message = 'Token 失效，请重新登录'
//           userStore.logout()
//           // 可以考虑在用户确认后刷新页面，或者执行其他操作
//           // window.location.reload()
//           break
//         case 403:
//           message = '拒绝访问'
//           break
//         case 404:
//           message = '请求地址错误'
//           break
//         case 500:
//           message = '服务器故障'
//           break
//         default:
//           message = '网络连接故障'
//       }
//       ElMessage.error(message)
//       return Promise.reject(error)  
//     }  
  
// );

// 封装 GET 请求
// export const get = <T>(
//     url: string,
//     params?: object
// ): Promise<T> => {
//     return instance.get<T>(url, { params }).then(response => response.data); // 修改这里;
// };
  
// // 封装 POST 请求
// export const post = <T>(
//     url: string,
//     data?: object
// ): Promise<T> => {
//     return instance.post<T>(url, data).then(response => response.data); // 修改这里;
// };
